.\" -*- nroff -*-
.\" Licensed under the OpenIB.org BSD license (FreeBSD Variant) - See COPYING.md
.\"
.TH IBV_CREATE_CQ_EX 3 2016-05-08 libibverbs "Libibverbs Programmer's Manual"
.SH "NAME"
ibv_create_cq_ex \- create a completion queue (CQ)
.SH "SYNOPSIS"
.nf
.B #include <infiniband/verbs.h>
.sp
.BI "struct ibv_cq_ex *ibv_create_cq_ex(struct ibv_context " "*context" ",
.BI "                                   struct ibv_cq_init_attr_ex " "*cq_attr" );
.fi
.SH "DESCRIPTION"
.B ibv_create_cq_ex()
creates a completion queue (CQ) for RDMA device context
.I context\fR.
The argument
.I cq_attr
is a pointer to struct ibv_cq_init_attr_ex as defined in <infiniband/verbs.h>.
.PP
.nf
struct ibv_cq_init_attr_ex {
.in +8
int                     cqe;               /* Minimum number of entries required for CQ */
void                    *cq_context;       /* Consumer-supplied context returned for completion events */
struct ibv_comp_channel *channel;          /* Completion channel where completion events will be queued. May be NULL if completion events will not be used. */
int                     comp_vector;       /* Completion vector used to signal completion events. Must be >= 0 and < context->num_comp_vectors. */
uint64_t                wc_flags;          /* The wc_flags that should be returned in ibv_poll_cq_ex. Or'ed bit of enum ibv_wc_flags_ex. */
uint32_t                comp_mask;         /* compatibility mask (extended verb). */
uint32_t                flags              /* One or more flags from enum ibv_create_cq_attr_flags */
struct ibv_pd           *parent_domain;    /* Parent domain to be used by this CQ */
.in -8
};

enum ibv_wc_flags_ex {
        IBV_WC_EX_WITH_BYTE_LEN              = 1 << 0,  /* Require byte len in WC */
        IBV_WC_EX_WITH_IMM                   = 1 << 1,  /* Require immediate in WC */
        IBV_WC_EX_WITH_QP_NUM                = 1 << 2,  /* Require QP number in WC */
        IBV_WC_EX_WITH_SRC_QP                = 1 << 3,  /* Require source QP in WC */
        IBV_WC_EX_WITH_SLID                  = 1 << 4,  /* Require slid in WC */
        IBV_WC_EX_WITH_SL                    = 1 << 5,  /* Require sl in WC */
        IBV_WC_EX_WITH_DLID_PATH_BITS        = 1 << 6,  /* Require dlid path bits in WC */
        IBV_WC_EX_WITH_COMPLETION_TIMESTAMP  = 1 << 7,  /* Require completion device timestamp in WC /*
        IBV_WC_EX_WITH_CVLAN                 = 1 << 8,  /* Require VLAN info in WC */
        IBV_WC_EX_WITH_FLOW_TAG		     = 1 << 9,  /* Require flow tag in WC */
        IBV_WC_EX_WITH_COMPLETION_TIMESTAMP_WALLCLOCK  = 1 << 11, /* Require completion wallclock timestamp in WC */
};

enum ibv_cq_init_attr_mask {
        IBV_CQ_INIT_ATTR_MASK_FLAGS             = 1 << 0,
        IBV_CQ_INIT_ATTR_MASK_PD                = 1 << 1,
};

enum ibv_create_cq_attr_flags {
        IBV_CREATE_CQ_ATTR_SINGLE_THREADED      = 1 << 0, /* This CQ is used from a single threaded, thus no locking is required */
        IBV_CREATE_CQ_ATTR_IGNORE_OVERRUN       = 1 << 1, /* This CQ will not pass to error state if overrun, CQE always will be written to next entry.
                                                           * An application must be designed to avoid ever overflowing the CQ, otherwise CQEs might be lost.
                                                           */
};

.SH "Polling an extended CQ"
In order to poll an extended CQ efficiently, a user could use the following functions.

.TP
.B Completion iterator functions

.BI "int ibv_start_poll(struct ibv_cq_ex " "*cq" ", struct ibv_poll_cq_attr " "*attr")
.br
Start polling a batch of work completions.
.I attr
is given in order to make this function
easily extensible in the future. This function either returns 0 on success or an error code
otherwise. When no completions are available on the CQ, ENOENT is returned, but the CQ remains
in a valid state. On success, querying the completion's attribute could be done using the query
functions described below. If an error code is given, end_poll shouldn't be called.

.BI "int ibv_next_poll(struct ibv_cq_ex " "*cq")
.br
This function is called in order to get the next work completion. It has to be called after
.I start_poll
and before
.I end_poll
are called. This function either returns 0 on success or an error code
otherwise. When no completions are available on the CQ, ENOENT is returned, but the CQ remains
in a valid state. On success, querying the completion's attribute could be done using the query
functions described below. If an error code is given, end_poll should still be called,
indicating this is the end of the polled batch.

.BI "void ibv_end_poll(struct ibv_cq_ex " "*cq")
.br
This function indicates the end of polling batch of work completions. After calling this function, the user should start a new batch
by calling
.I start_poll.

.TP
.B Polling fields in the completion
Below members and functions are used in order to poll the current completion. The current completion is the completion which the iterator points to (start_poll and next_poll advances this iterator). Only fields that the user requested via wc_flags in ibv_create_cq_ex could be queried. In addition, some fields are only valid in certain opcodes and status codes.

.BI "uint64_t wr_id - Can be accessed directly from struct ibv_cq_ex".

.BI "enum ibv_wc_status - Can be accessed directly from struct ibv_cq_ex".

.BI "enum ibv_wc_opcode ibv_wc_read_opcode(struct ibv_cq_ex " "*cq"); \c
 Get the opcode from the current completion.

.BI "uint32_t ibv_wc_read_vendor_err(struct ibv_cq_ex " "*cq"); \c
 Get the vendor error from the current completion.

.BI "uint32_t ibv_wc_read_byte_len(struct ibv_cq_ex " "*cq"); \c
 Get the payload length from the current completion.

.BI "__be32 ibv_wc_read_imm_data(struct ibv_cq_ex " "*cq"); \c
 Get the immediate data field from the current completion.

.BI "uint32_t ibv_wc_read_invalidated_rkey(struct ibv_cq_ex " "*cq"); \c
 Get the rkey invalided by the SEND_INVAL from the current completion.

.BI "uint32_t ibv_wc_read_qp_num(struct ibv_cq_ex " "*cq"); \c
 Get the QP number field from the current completion.

.BI "uint32_t ibv_wc_read_src_qp(struct ibv_cq_ex " "*cq"); \c
 Get the source QP number field from the current completion.

.BI "unsigned int ibv_wc_read_wc_flags(struct ibv_cq_ex " "*cq"); \c
 Get the QP flags field from the current completion.

.BI "uint16_t ibv_wc_read_pkey_index(struct ibv_cq_ex " "*cq"); \c
 Get the pkey index field from the current completion.

.BI "uint32_t ibv_wc_read_slid(struct ibv_cq_ex " "*cq"); \c
 Get the slid field from the current completion.

.BI "uint8_t ibv_wc_read_sl(struct ibv_cq_ex " "*cq"); \c
 Get the sl field from the current completion.

.BI "uint8_t ibv_wc_read_dlid_path_bits(struct ibv_cq_ex " "*cq"); \c
 Get the dlid_path_bits field from the current completion.

.BI "uint64_t ibv_wc_read_completion_ts(struct ibv_cq_ex " "*cq"); \c
 Get the completion timestamp from the current completion in HCA clock units.

.BI "uint64_t ibv_wc_read_completion_wallclock_ns(struct ibv_cq_ex " *cq ");
Get the completion timestamp from the current completion and convert it
from HCA clock units to wall clock nanoseconds.

.BI "uint16_t ibv_wc_read_cvlan(struct ibv_cq_ex " "*cq"); \c
 Get the CVLAN field from the current completion.

.BI "uint32_t ibv_wc_read_flow_tag(struct ibv_cq_ex " "*cq"); \c
 Get flow tag from the current completion.

.BI "void ibv_wc_read_tm_info(struct ibv_cq_ex " *cq ","
.BI "struct ibv_wc_tm_info " *tm_info "); \c
 Get tag matching info from the current completion.
.nf
struct ibv_wc_tm_info {
.in +8
uint64_t tag;  /* tag from TMH */
uint32_t priv; /* opaque user data from TMH */
.in -8
};

.SH "RETURN VALUE"
.B ibv_create_cq_ex()
returns a pointer to the CQ, or NULL if the request fails.
.SH "NOTES"
.B ibv_create_cq_ex()
may create a CQ with size greater than or equal to the requested
size. Check the cqe attribute in the returned CQ for the actual size.
.PP
CQ should be destroyed with ibv_destroy_cq.
.PP
.SH "SEE ALSO"
.BR ibv_create_cq (3),
.BR ibv_destroy_cq (3),
.BR ibv_resize_cq (3),
.BR ibv_req_notify_cq (3),
.BR ibv_ack_cq_events (3),
.BR ibv_create_qp (3),
.BR ibv_alloc_parent_domain (3)
.SH "AUTHORS"
.TP
Matan Barak <matanb@mellanox.com>
